package org.dei.perla.parser.grammar.context;

import java.util.ArrayList;

import org.dei.perla.context.CDT;
import org.dei.perla.context.DimensionStructure;
import org.dei.perla.context.Value;
import org.dei.perla.context.ValueOnBased;
import org.dei.perla.context.ValueWhenBased;
import org.dei.perla.parser.expressions.ConstantString;
import org.dei.perla.parser.grammar.Token;


public class StatementDimension {
	
	
	/**
	 * Lista di coppie di valori (Token, Field) associati ai campi della DataStructure
	 */
	public static ArrayList<Value> valueList = null;
	
	/**
	 * Token dello Statement corrente
	 */
	public static Token currentStatementToken = null;
	
	
	/**
	 * Reset della dimensione
	 */
	public static void clear() {
		
		valueList = null;
		currentStatementToken = null;
	}
	

	/**
	 * 
	 * @return Restituisce la lista dei valore che faranno parte della dimensione
	 */
	public static ArrayList<Value> getValues(){
		return valueList;
	}
	
	/**
	 * Metodo che aggiunge alla lista di valori un valore basato sulla WHEN
	 * @param tokenName token del valore
	 * @param condition condizione del valore
	 */
	public static void addValueWhenBased(Token tokenName, ConstantString condition) {
		
		if(valueList == null) {
			
		valueList = new ArrayList<Value>();
		}
		ValueWhenBased value = new ValueWhenBased(tokenName.image,currentStatementToken.image,condition.getValueString());
		valueList.add(value);
	}

	/**
	 * Metodo che aggiunge alla lista di valori un valore basato sulla ON
	 * @param tokenName token del valore
	 * @param condition condizione del valore
	 */
	public static void addValueOnBased(Token tokenName, ConstantString condition) {
		
		if(valueList == null) {
			
		valueList = new ArrayList<Value>();
		}
		ValueOnBased value = new ValueOnBased(tokenName.image,currentStatementToken.image,condition.getValueString());
		valueList.add(value);
	}

	/**
	 * Metodo che aggiunge la dimensione al CDT
	 * @param dimension dimensione da aggiungere
	 */
	public static void addDimensionToCDT(DimensionStructure dimension){
		CDT cdt = CDT.getDefault();
		cdt.addDimensionToCDT(dimension);
		System.out.println(dimension.toString());
	}
	
	/**
	 * Metodo che aggiunge un valore alla dimensione
	 * @param dimension dimensione su cui aggiungere il valore
	 */
	public static void addValueToDimension(DimensionStructure dimension){
		for (int i=0;i<valueList.size();i++){
			valueList.get(i).setDimension(dimension);
		}
		dimension.setValues(valueList);
	}
}
